/*
 * @Author: moeWang
 * @Date: 2021-09-08 10:06:50
 * @LastEditTime: 2021-09-08 11:14:13
 * @LastEditors: moeWang
 * @Description: 发布订阅模式
 * @FilePath: \front-end-design-mode\code\Event.js
 */

// // 售楼处
// var salesOffices = {}

// // 定义缓存列表，存订阅者的回调
// salesOffices.clientList = []

// salesOffices.listen = function(fn) {
//     this.clientList.push(fn)
// }

// // 发布消息
// salesOffices.trigger = function() {
//     for(var i = 0,fn; fn = this.clientList[i++];) {
//         fn.apply(this , arguments)
//     }
// }

// // a订阅
// salesOffices.listen(function(price , square) {
//     console.log('a');
//     console.log('价格:', price);
//     console.log('面积:', square);
// })
// // b订阅
// salesOffices.listen(function(price , square) {
//     console.log('b');
//     console.log('价格:', price);
//     console.log('面积:', square);
// })

// salesOffices.trigger(2000000 , 88)
// salesOffices.trigger(3000000 , 110)

// ?问题：我只想订阅88的，却把114也发布给我，需要增加key标识
// 完善代码

// // 缓存列表
// salesOffices.clientList = {}

// salesOffices.listen = function (key, fn) {
//     if (!this.clientList[key]) { // 如果没订阅过此类消息，给该类消息创建缓存列表
//         this.clientList[key] = []
//     }
//     this.clientList[key].push(fn)
// }

// salesOffices.trigger = function () {
//     var key = Array.prototype.shift.call(arguments) // 取消息类型
//     var fns = this.clientList[key]
//     if (!fns || fns.length === 0) { // 边界情况处理
//         return false
//     }
//     for (var i = 0, fn; fn = fns[i++];) {
//         fn.apply(this, arguments)
//     }
// }
// // a订阅88平的消息
// salesOffices.listen('square88', function (price) {
//     console.log('a-price:', price);
// })
// // b订阅110平的消息
// salesOffices.listen('square110', function (price) {
//     console.log('b-price:', price);
// })
// // 售楼处发布消息
// salesOffices.trigger('square88' , 200000)
// salesOffices.trigger('square110' ,300000)

/* 通用发布订阅 */
// 时间上解耦、对象之间解耦，对应的会消耗时间和内存
var Event = (function () {
    var clientList = {},
        listen, trigger, remove
    listen = function (key, fn) {
        if (!clientList[key]) {
            clientList[key] = []
        }
        clientList[key].push(fn)
    }
    trigger = function () {
        var key = Array.prototype.shift.call(arguments)
        var fns = clientList[key]
        if (!fns || fns.length === 0) {
            return false
        }
        for (var i = 0, fn; fn = fns[i++];) {
            fn.apply(this, arguments)
        }
    }
    remove = function (key, fn) {
        var fns = clientList[key]
        if (!fns) {
            return false
        }
        if (!fn) {
            fns && (fns.length = 0)
        } else {
            for (var i = fns.length - 1; i >= 0; i--) {
                var _fn = fns[i]
                if (_fn === fn) {
                    fns.splice(i, 1)
                }
            }
        }

    }
    return {
        listen, trigger, remove
    }
})()

Event.listen('square88' , function(price) {
    console.log('price:' , price);
})

Event.trigger('square88' , 2000000)